.Dd Mar 2, 2010
.Dt GETCONTEXT 3
.Os 
.Sh NAME
.Nm getcontext ,
.Nm setcontext
.Nd get and set current user context
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
.In ucontext.h
.Ft int
.Fn getcontext "ucontext_t *ucp"
.Ft int
.Fn setcontext "const ucontext_t *ucp"
.Sh DESCRIPTION
The
.Xr makecontext 3
, 
.Xr swapcontext 3
, 
.Xr getcontext 3
, and 
.Xr setcontext 3
together form a set of functions that allow user-level context switching between multiple threads of control within a process.
.Pp
The
.Vt ucontext_t
type is a structure that has at least the following members:
.Bd -offset 4n -literal
typedef struct __ucontext {
	ucontext_t *uc_link;
	sigset_t uc_sigmask;
	stack_t uc_stack;
	mcontext_t uc_mcontext;
	 ...
} ucontext_t;
.Ed

with
.Vt sigset_t
and
.Vt stack_t
defined in
.In signal.h .
Here 
.Va uc_link
points to the context that will be resumed when the current context returns (if 
.Va uc_link
is NULL, the process exits), 
.Va uc_sigmask
is the set of signals blocked in this context, 
.Va uc_stack
is the stack used by this context (when the context was modified by
.Xr makecontext 3 ),
and 
.Va uc_mcontext
is the machine-specific representation of the saved context. The 
.Vt mcontext_t
type is machine-dependent and opaque.
.Pp
MINIX 3 has an additional 
.Va uc_flags
member that supports the following flags:
.Pp
.Bd -offset 4n -literal
UCF_IGNSIGM /* Current signal mask is not stored or restored */
UCF_IGNFPU  /* FPU state is not stored or restored for this context */
.Ed
.Pp
Not storing and restoring the signal mask and/or FPU state speeds up context switching considerably.
.Pp
The
.Fn getcontext 
function initializes the structure pointed to by 
.Va ucp
to the current user context of the calling thread. 
.Pp
The
.Fn setcontext
function restores the user context pointed to by 
.Va ucp .
A succesful call does not return; program execution resumes at the point specified by the 
.Va ucp
argument passed to
.Fn setcontext .
The 
.Va ucp
argument should be created either by a prior call to
.Fn getcontext
or
.Fn makecontext .
If the 
.Va ucp
argument was created with
.Fn getcontext ,
program execution continues as if the corresponding call of
.Fn getcontext 
had just returned. If the 
.Va ucp
argument was created with
.Fn makecontext ,
program execution continues with the function passed to
.Fn makecontext .

.Sh RETURN VALUES
When successful,
.Fn getcontext
returns 0 and 
.Fn setcontext
does not return. Otherwise, both return -1 and
.Va errno 
is set to indicate the error. 

.Sh ERRORS
.Bl -tag -width Er
.It Bq Er EINVAL
The context is not properly initialized.
.It Bq Er EFAULT
.Va ucp
is a NULL pointer.
.El
.Sh SEE ALSO
.Xr makecontext 3 ,
.Xr swapcontext 3
.Sh STANDARDS
The
.Fn getcontext ,
and
.Fn setcontext
functions conform to
.St -xsh5
and
.St -p1003.1-2001 .
.Sh AUTHORS
Thomas Veerman
